package event

import (
	"github.com/pkg/errors"
	"reflect"
)

// 事件，使用 protocol-buffer 定义的事件
type PbEvent interface {
	XXX_Unmarshal(b []byte) error
	XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
}

// 事件数据消息
type PbEventMessage struct {
	// 事件数据类型：包/结构体名
	Type string
	// 事件数据
	Data []byte
}

func (msg PbEventMessage) Unmarshal(event PbEvent) error {

	// 必须接受一个指针，方便赋值
	rt := reflect.TypeOf(event)
	if rt.Kind() != reflect.Ptr {
		return errors.New("target event must be point")
	}

	// 事件数据类型校验
	t := FullTypeNameOf(event)
	if msg.Type != t {
		return errors.Errorf("type %s cannot be converted to %s", msg.Type, t)
	}

	// 数据解码
	err := event.XXX_Unmarshal(msg.Data)
	if nil != err {
		return err
	}

	return nil
}
